#include "ros/ros.h"
#include "std_msgs/String.h"
            //引用了位于std_msgs包里的std_msgs/String消息。这是从std_msgs包里的String.msg文件中自动生成的头文件
#include <sstream>
#include "package1/crypto.h"   // 安装c++加密库crypto++ 可参考 https://blog.csdn.net/github_39533414/article/details/84898212  
#include "package1/Num.h"

int main(int argc, char **argv)
{
    ros::init(argc, argv, "talker");
            	// 初始化ROS。这使得ROS可以通过命令行进行名称重映射——不过目前不重要。这也是我们给节点指定名称的地方。
    ros::NodeHandle n;
            	//为这个进程的节点创建句柄
    ros::Publisher chatter_pub = n.advertise<package1::Num>("/chatter", 10000);
            	//告诉主节点我们将要在chatter话题上发布一个类型为std_msgs/String的消息。
            	//第二个参数是发布队列的大小。在本例中，如果我们发布得太快，它将最多缓存1000条消息，不然就会丢弃旧消息。
    ros::Rate loop_rate(1);
    int count = 0;
    unsigned int the_key_size;
    std::string the_key;
    std::cout << "Define your length of key(only 16 ,24 or 32 bytes):";
    //AES 是一种区块加密算法，加密时会将原始数据按大小拆分成一个个区块进行加密，区块大小固定为 128 比特（即 16 字节） AES 密钥长度可以是 128、192 或 256 比特（即 16、24 或 32 字节），密钥长度越长，安全性越高，而性能也就越低
    std::cin >> the_key_size;
    std::cout << "Define your key and Safekeeping:";
    std::cin >> the_key;
    package1::Num msg_num;
    msg_num.the_key = the_key;
	while(ros::ok())
        {
            std::stringstream ss;   //待加密的数据对象
            ss << "This is YJH's symmetrical encryption algrithm practice "<< count;  
            std::string origin_msg = ss.str();
            msg_num.Data.data = CCryptoUtil::aes_encrypt_ecb_hex(origin_msg,(unsigned char*)the_key.c_str(), the_key_size);
            chatter_pub.publish(msg_num);
            ROS_INFO("sending:[%s]",origin_msg.c_str());
            ros::spinOnce();
            loop_rate.sleep();
            ++count;            
        }
    return 0;
}